import { Module, Global, RequestMethod } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { DemoController } from './controllers/demo.controller';
import { Demo2Controller } from './controllers/demo2.controller';
import { AppService } from './app.service';
import { CatsController } from './controllers/cats.controller';
import { CatsService } from './providers/cats.service';
import { LoggerMiddleware2 } from './middleware/logger.middleware';
import { Order } from './entity/Order'
import {UsersModule} from './modules/order/order.module'
import {AuthModule} from './modules/auth/auth.module';
// 每个module都封装了一组密切相关的功能。建议使用module分割功能，也就是创建一个 Feature modules
// 如果controller用了service，那么需要在module里的providers里注册
// 默认启动时，实例化所有的provider，关闭时销毁，但是可以让Provider request-scoped
// Nest内置控制反转IOC来解决 Provider之间的关系
// @Global() 让这个模块变成全局的，然后其他模块不用import进来，就可以使用它的export的providers
@Global()
@Module({
  // 其他模块export的providers
  imports: [
    // synchronize: true, // 在生产中不应该是true，否则可能会丢失生产数据
    // 如果现在外部配置了ormconfig.json 就不用直接写json配置了
    // ormconfig.json 文件是typeorm解析的，配置额外属性不会生效

    // 可以使用多个库，使用时配置一下 name字段

    TypeOrmModule.forRoot(

      {
        type: 'mysql',
        host: 'localhost',
        port: 3306,
        username: 'root',
        password: '123',
        database: 'hua',
        entities: [Order],
        // entities: [__dirname + '/**/*.entity{.ts,.js}'],
        synchronize: true,
        autoLoadEntities: true, // 开启了这个，forFeature注册的实体，会自动添加到entities
      }
    ),
    UsersModule,
    AuthModule
  ],
  // 一个module导出providers部分给其他模块用的，可视为此模块的公共接口或者API
  exports: [],
  // 这个模块要实例化的controller
  controllers: [AppController, DemoController, Demo2Controller, CatsController],
  // Nest injector 实例化的 Providers
  providers: [AppService, CatsService],
})
export class AppModule {
  // module的configure来使用中间件,此方法可以async
  configure(consumer) {
    consumer.apply(LoggerMiddleware2).forRoutes(CatsController);
    // 简单使用         forRoutes('cats')
    // 正则匹配路由      forRoutes('cat*') forRoutes('cat*')
    // 指定http请求方法  forRoutes({ path: 'cats', method: RequestMethod.GET });
  }
}

/**
 * 入口module，引入其他 Feature modules
 * module默认是单例模式
 * import { CatsModule } from './cats/cats.module';
   @Module({
    imports: [CatsModule],
  })
   export class AppModule {}
 */
